/**
 * 音乐下载处理器
 */

import BaseDownloadHandler from './BaseDownloadHandler.js'
import DownloadCore from './DownloadCore.js'
import ChatHistory from '../ChatHistory.js'

class MusicDownloadHandler extends BaseDownloadHandler {
  
  /**
   * 获取音乐名称
   * @param {Object} music 音乐对象
   * @returns {string} 音乐名称
   */
  static getItemName(music) {
    if (music.name && music.name.trim() !== '') {
      return music.name
    }
    
    if (music.title && music.title.trim() !== '') {
      return music.title
    }
    
    if (music.songName && music.songName.trim() !== '') {
      return music.songName
    }
    
    if (music.id) {
      return `音乐 #${music.id}`
    }
    
    try {
      const url = music.downloadUrl || music.url
      if (url) {
        const urlObj = new URL(url)
        const pathParts = urlObj.pathname.split('/')
        const filename = pathParts[pathParts.length - 1]
        if (filename && filename !== '') {
          const nameWithoutExt = filename.split('.')[0]
          return nameWithoutExt || '未知音乐'
        }
      }
    } catch (e) {
      console.log('无法从 URL 提取音乐名称')
    }
    
    return '未知音乐'
  }
  
  /**
   * 获取音乐类型
   * @param {Object} music 音乐对象
   * @returns {string} 音乐类型
   */
  static getItemType(music) {
    return music.type ? music.type.toLowerCase() : 'music'
  }
  
  /**
   * 获取显示名称
   * @param {Object} music 音乐对象
   * @returns {string} 显示名称
   */
  static getDisplayName(music) {
    const musicName = this.getItemName(music)
    const artist = music.artist || music.singer || '未知艺术家'
    const album = music.album ? ` - ${music.album}` : ''
    return `${musicName} - ${artist}${album}`
  }
  
  /**
   * 获取下载选项
   * @param {Object} music 音乐对象
   * @returns {Array} 下载选项列表
   */
  static getDownloadOptions(music) {
    const options = []
    
    // 支持多种音质下载
    if (music.highQualityUrl) {
      options.push({
        label: '高音质(320K)',
        url: music.highQualityUrl,
        type: '高音质下载'
      })
    }
    
    if (music.mediumQualityUrl) {
      options.push({
        label: '标准音质(192K)',
        url: music.mediumQualityUrl,
        type: '标准音质下载'
      })
    }
    
    if (music.lowQualityUrl) {
      options.push({
        label: '普通音质(128K)',
        url: music.lowQualityUrl,
        type: '普通音质下载'
      })
    }
    
    // 如果没有特定音质，使用通用下载链接
    if (options.length === 0 && (music.downloadUrl || music.url)) {
      options.push({
        label: '下载音乐',
        url: music.downloadUrl || music.url,
        type: '通用下载'
      })
    }
    
    return options
  }
  
  /**
   * 获取分类名称
   * @returns {string} 分类名称
   */
  static getCategory() {
    return '音乐'
  }
  
  /**
   * 开始下载
   * @param {Object} music 音乐对象
   * @param {string} downloadUrl 下载链接
   * @param {string} targetDir 目标目录
   */
  static startDownload(music, downloadUrl, targetDir) {
    const itemName = this.getItemName(music)
    const musicType = this.getItemType(music)
    
    // 使用下载核心模块处理下载
    DownloadCore.startDownload({
      item: music,
      itemName: itemName,
      itemType: musicType,
      downloadUrl: downloadUrl,
      targetDir: targetDir,
      category: 'music',
      historyHandler: null,
      getDirectory: this.getMusicDirectory.bind(this),
      getDefaultExtension: this.getDefaultExtension.bind(this)
    })
  }
  
  /**
   * 获取默认文件扩展名
   * @param {string} musicType 音乐类型
   * @param {string} downloadUrl 下载链接
   * @returns {string} 默认扩展名
   */
  static getDefaultExtension(musicType, downloadUrl = '') {
    // 根据下载链接判断格式
    if (downloadUrl.includes('.flac')) return '.flac'
    if (downloadUrl.includes('.wav')) return '.wav'
    if (downloadUrl.includes('.m4a')) return '.m4a'
    if (downloadUrl.includes('.aac')) return '.aac'
    if (downloadUrl.includes('.ogg')) return '.ogg'
    
    // 默认使用mp3格式
    return '.mp3'
  }
  
  /**
   * 获取音乐存储目录
   * @param {string} musicType 音乐类型
   * @returns {string} 目录路径
   */
  static getMusicDirectory(musicType) {
    // 所有音乐文件都下载到 /RuoyiApp/music 目录下
    const baseDir = '/RuoyiApp/music'
    return baseDir
  }
}

export default MusicDownloadHandler